{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1insert  tool kit"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "insert  tool kit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "from sklearn.linear_model import LinearRegression, RidgeCV, LassoCV, ElasticNetCV\n",
    "\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from sklearn.metrics import r2_score\n",
    "\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns# 图形出现在Notebook里而不是新窗口\n",
    "%matplotlib inline             "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#2 data insert"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>instant</th>\n",
       "      <th>season_1</th>\n",
       "      <th>season_2</th>\n",
       "      <th>season_3</th>\n",
       "      <th>season_4</th>\n",
       "      <th>mnth_1</th>\n",
       "      <th>mnth_2</th>\n",
       "      <th>mnth_3</th>\n",
       "      <th>mnth_4</th>\n",
       "      <th>mnth_5</th>\n",
       "      <th>...</th>\n",
       "      <th>weekday_5</th>\n",
       "      <th>weekday_6</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>holiday</th>\n",
       "      <th>workingday</th>\n",
       "      <th>yr</th>\n",
       "      <th>cnt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.355170</td>\n",
       "      <td>0.373517</td>\n",
       "      <td>0.828620</td>\n",
       "      <td>0.284606</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>985</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.379232</td>\n",
       "      <td>0.360541</td>\n",
       "      <td>0.715771</td>\n",
       "      <td>0.466215</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>801</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.171000</td>\n",
       "      <td>0.144830</td>\n",
       "      <td>0.449638</td>\n",
       "      <td>0.465740</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.175530</td>\n",
       "      <td>0.174649</td>\n",
       "      <td>0.607131</td>\n",
       "      <td>0.284297</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1562</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.209120</td>\n",
       "      <td>0.197158</td>\n",
       "      <td>0.449313</td>\n",
       "      <td>0.339143</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1600</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 35 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   instant  season_1  season_2  season_3  season_4  mnth_1  mnth_2  mnth_3  \\\n",
       "0        1         1         0         0         0       1       0       0   \n",
       "1        2         1         0         0         0       1       0       0   \n",
       "2        3         1         0         0         0       1       0       0   \n",
       "3        4         1         0         0         0       1       0       0   \n",
       "4        5         1         0         0         0       1       0       0   \n",
       "\n",
       "   mnth_4  mnth_5  ...   weekday_5  weekday_6      temp     atemp       hum  \\\n",
       "0       0       0  ...           0          1  0.355170  0.373517  0.828620   \n",
       "1       0       0  ...           0          0  0.379232  0.360541  0.715771   \n",
       "2       0       0  ...           0          0  0.171000  0.144830  0.449638   \n",
       "3       0       0  ...           0          0  0.175530  0.174649  0.607131   \n",
       "4       0       0  ...           0          0  0.209120  0.197158  0.449313   \n",
       "\n",
       "   windspeed  holiday  workingday  yr   cnt  \n",
       "0   0.284606        0           0   0   985  \n",
       "1   0.466215        0           0   0   801  \n",
       "2   0.465740        0           1   0  1349  \n",
       "3   0.284297        0           1   0  1562  \n",
       "4   0.339143        0           1   0  1600  \n",
       "\n",
       "[5 rows x 35 columns]"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.read_csv(\"/home/listen/FE_day.csv\")\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2.2# 样本数目、特征维数 每个特征的类型、空值样本的数目、数据类型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2.3 data tansuo   read FE_  \n",
    "it can help us option a modeul at 3th step   base on data's feature"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2.4 data prepare\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# 从原始数据中分离输入特征x和输出y\n",
    "y=data['cnt']\n",
    "X=data.drop('cnt',axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "shape is: (584, 34)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>instant</th>\n",
       "      <th>season_1</th>\n",
       "      <th>season_2</th>\n",
       "      <th>season_3</th>\n",
       "      <th>season_4</th>\n",
       "      <th>mnth_1</th>\n",
       "      <th>mnth_2</th>\n",
       "      <th>mnth_3</th>\n",
       "      <th>mnth_4</th>\n",
       "      <th>mnth_5</th>\n",
       "      <th>...</th>\n",
       "      <th>weekday_4</th>\n",
       "      <th>weekday_5</th>\n",
       "      <th>weekday_6</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>holiday</th>\n",
       "      <th>workingday</th>\n",
       "      <th>yr</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>630</th>\n",
       "      <td>631</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.736253</td>\n",
       "      <td>0.697558</td>\n",
       "      <td>0.664953</td>\n",
       "      <td>0.538460</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>192</th>\n",
       "      <td>193</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.915892</td>\n",
       "      <td>0.866609</td>\n",
       "      <td>0.574979</td>\n",
       "      <td>0.366672</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>275</th>\n",
       "      <td>276</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.405012</td>\n",
       "      <td>0.410824</td>\n",
       "      <td>0.782348</td>\n",
       "      <td>0.125660</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>367</th>\n",
       "      <td>368</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.113228</td>\n",
       "      <td>0.061963</td>\n",
       "      <td>0.453728</td>\n",
       "      <td>0.707688</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>296</th>\n",
       "      <td>297</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.503656</td>\n",
       "      <td>0.496173</td>\n",
       "      <td>0.793916</td>\n",
       "      <td>0.198734</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 34 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     instant  season_1  season_2  season_3  season_4  mnth_1  mnth_2  mnth_3  \\\n",
       "630      631         0         0         1         0       0       0       0   \n",
       "192      193         0         0         1         0       0       0       0   \n",
       "275      276         0         0         0         1       0       0       0   \n",
       "367      368         1         0         0         0       1       0       0   \n",
       "296      297         0         0         0         1       0       0       0   \n",
       "\n",
       "     mnth_4  mnth_5 ...  weekday_4  weekday_5  weekday_6      temp     atemp  \\\n",
       "630       0       0 ...          0          0          1  0.736253  0.697558   \n",
       "192       0       0 ...          0          0          0  0.915892  0.866609   \n",
       "275       0       0 ...          0          0          0  0.405012  0.410824   \n",
       "367       0       0 ...          0          0          0  0.113228  0.061963   \n",
       "296       0       0 ...          0          0          0  0.503656  0.496173   \n",
       "\n",
       "          hum  windspeed  holiday  workingday  yr  \n",
       "630  0.664953   0.538460        0           0   1  \n",
       "192  0.574979   0.366672        0           1   0  \n",
       "275  0.782348   0.125660        0           1   0  \n",
       "367  0.453728   0.707688        0           1   1  \n",
       "296  0.793916   0.198734        0           1   0  \n",
       "\n",
       "[5 rows x 34 columns]"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#将数据分割训练数据与测试数据\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "\n",
    "# 随机采样20%的数据构建测试样本，其余作为训练样本\n",
    "X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=33,test_size=0.2)\n",
    "print(\"shape is:\" ,X_train.shape)\n",
    "\n",
    "feat_names = X_train.columns\n",
    "X_train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "shape is: (584, 33)\n"
     ]
    }
   ],
   "source": [
    "#保存测试ID，用于结果提交\n",
    "testID = X_test['instant']\n",
    "#ID不参与预测\n",
    "X_train.drop(['instant'], axis=1, inplace = True)\n",
    "X_test.drop(['instant'], axis=1, inplace = True)\n",
    "\n",
    "#保存特征名字以备后用（可视化）\n",
    "feat_names = X_train.columns\n",
    "print(\"shape is:\" ,X_train.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2.5 数据预处理／特征工程  FE_\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2.6 OLS尝试,无需调超参数，可以将所有数据输入"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "mse_trian = 746.4345513061153\n",
      "mse_test = 825.330500692995\n",
      "r2_trian = 0.8501743130370414\n",
      "r2_test = 0.823330510227655\n"
     ]
    }
   ],
   "source": [
    "#1,creat a  LinearRegression\n",
    "lr=LinearRegression()\n",
    "#2 train the learner\n",
    "lr.fit(X_train,y_train)\n",
    "#3 predict\n",
    "y_train_pre=lr.predict(X_train)\n",
    "y_test_pre=lr.predict(X_test)\n",
    "#y_test_pre +=mean_diff\n",
    "\n",
    "rmse_train=np.sqrt(mean_squared_error(y_train,y_train_pre))\n",
    "rmse_test=np.sqrt(mean_squared_error(y_test,y_test_pre))\n",
    "print('mse_trian =',rmse_train)\n",
    "print('mse_test =',rmse_test)\n",
    "\n",
    "r2_score_train=r2_score(y_train,y_train_pre)\n",
    "r2_score_test=r2_score(y_test,y_test_pre)\n",
    "print('r2_trian =',r2_score_train)\n",
    "print('r2_test =',r2_score_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2.72* Linear Regression with Ridge regularization "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best alpha = 1.0\n",
      "rmse_cv [ 794.91574388  791.32251248  787.94881446  811.13397736 1084.78992001\n",
      " 1698.20239577]\n",
      "rmse_trian = 746.292901722334\n",
      "rmse_test = 811.4172211979596\n",
      "r2_trian = 0.8502311719604638\n",
      "r2_test = 0.8292368308562192\n"
     ]
    }
   ],
   "source": [
    "# 1. 设置超参数搜索范围，生成学习器实例\n",
    "# RidgeCV(alphas=(0.1, 1.0, 10.0), fit_intercept=True, normalize=False, scoring=None, cv=None, gcv_mode=None, store_cv_values=False)\n",
    "alphas=[0.01, 0.1, 1, 10, 100, 1000]\n",
    "ridge=RidgeCV(alphas=alphas, store_cv_values=True )\n",
    "\n",
    "#2 train it for geting the best alpha,RidgeCV采用的是广义交叉验证（Generalized Cross-Validation），留一交叉验证（N-折交叉验证）的一种有效实现方式\n",
    "ridge.fit(X_train,y_train)    #交叉验证得到的最佳超参数alpha\n",
    "\n",
    "alpha = ridge.alpha_\n",
    "print(\"best alpha =\",alpha)\n",
    "\n",
    "# 交叉验证估计的测试误差\n",
    "mse_cv=np.mean(ridge.cv_values_,axis=0)\n",
    "rmse_cv=np.sqrt(mse_cv)\n",
    "print(\"rmse_cv\",rmse_cv)\n",
    "\n",
    "#3 predict\n",
    "y_train_pre=ridge.predict(X_train)\n",
    "y_test_pre=ridge.predict(X_test)\n",
    "#y_test_pre +=mean_diff\n",
    "\n",
    "rmse_train=np.sqrt(mean_squared_error(y_train,y_train_pre))\n",
    "rmse_test=np.sqrt(mean_squared_error(y_test,y_test_pre))\n",
    "print('rmse_trian =',rmse_train)\n",
    "print('rmse_test =',rmse_test)\n",
    "\n",
    "r2_score_train=r2_score(y_train,y_train_pre)\n",
    "r2_score_test=r2_score(y_test,y_test_pre)\n",
    "print('r2_trian =',r2_score_train)\n",
    "print('r2_test =',r2_score_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# L1  LASSO"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.6/dist-packages/sklearn/model_selection/_split.py:1943: FutureWarning: You should specify a value for 'cv' instead of relying on the default value. The default value will change from 3 to 5 in version 0.22.\n",
      "  warnings.warn(CV_WARNING, FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best alpha = 3.82310738833874\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cv of rmse 821.0117318034193\n",
      "RMSE on Training set : 750.3338809143283\n",
      "RMSE on Test set : 801.7720093590274\n",
      "r2_score on Training set : 0.8486048634429293\n",
      "r2_score on Test set : 0.8332723819405335\n",
      "Lasso picked 28 features and eliminated the other 5 features\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "lasso=LassoCV()\n",
    "\n",
    "lasso.fit(X_train,y_train)\n",
    "alpha=lasso.alpha_\n",
    "print(\"best alpha =\",alpha)\n",
    "#3\n",
    "mses=np.mean(lasso.mse_path_,axis=1)\n",
    "plt.plot(np.log10(lasso.alphas_),mses)\n",
    "\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show()\n",
    "\n",
    "mse_cv=np.mean(lasso.mse_path_,axis=1)\n",
    "rmse_cv=np.sqrt(mse_cv)\n",
    "print(\"cv of rmse\",min(rmse_cv))\n",
    "\n",
    "#训练误差\n",
    "y_train_pre = lasso.predict(X_train)\n",
    "rmse_train = np.sqrt(mean_squared_error(y_train,y_train_pre))\n",
    "print(\"RMSE on Training set :\" ,rmse_train)\n",
    "\n",
    "#测试误差\n",
    "y_test_pre = lasso.predict(X_test)\n",
    "rmse_test = np.sqrt(mean_squared_error(y_test,y_test_pre))\n",
    "print(\"RMSE on Test set :\" ,rmse_test)\n",
    "\n",
    "r2_score_train = r2_score(y_train,y_train_pre)\n",
    "r2_score_test = r2_score(y_test,y_test_pre)\n",
    "print(\"r2_score on Training set :\" , r2_score_train)\n",
    "print(\"r2_score on Test set :\" , r2_score_test)\n",
    " \n",
    "# 4. 特征重要性\n",
    "#Plot important coefficients\n",
    "coefs = pd.Series(lasso.coef_, index = feat_names)\n",
    "print(\"Lasso picked \" + str(sum(coefs != 0)) + \" features and eliminated the other \" +  \\\n",
    "      str(sum(coefs == 0)) + \" features\")\n",
    "imp_coefs = pd.concat([coefs.sort_values().head(10),\n",
    "                     coefs.sort_values().tail(10)])\n",
    "imp_coefs.plot(kind = \"barh\")\n",
    "plt.title(\"Coefficients in the Lasso Model\")\n",
    "plt.show()\n",
    "\n",
    "#5. 显示不同alpha对应的模型性能\n",
    "plt.plot(np.log10(lasso.alphas_), mse_cv) \n",
    "\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show() \n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test_pred = lr.predict(X_test)\n",
    "\n",
    "#生成提交测试结果\n",
    "df = pd.DataFrame({\"instant\":testID, 'cnt':y_test_pred})\n",
    "df.to_csv('LR.predict.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test_pred = ridge.predict(X_test)\n",
    "\n",
    "#生成提交测试结果\n",
    "df = pd.DataFrame({\"instant\":testID, 'cnt':y_test_pred})\n",
    "df.to_csv('Ridge.predict.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test_pred = lasso.predict(X_test)\n",
    "\n",
    "#生成提交测试结果\n",
    "df = pd.DataFrame({\"instant\":testID, 'cnt':y_test_pred})\n",
    "df.to_csv('Lasso.predict.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
